package com.cn.wanxi.util;

import com.cn.wanxi.model.UserModel;

import java.sql.*;
import java.util.List;

/**
 * 步骤：
 * 1.加载驱动
 * 2.得到连接
 * 3.编译sql
 * 4.执行sql
 * 5.得到结果集
 * 6.关闭连接
 */
public class JDBC {
    static {
        try {
//            mysql版本为5.几版本的驱动com.mysql.jdbc.Driver
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    private static Connection connection = null;
    private static PreparedStatement preparedStatement = null;

    /**
     * 得到数据库连接：连接数据库必要的数据是什么？
     *
     * @return
     */
    private static Connection getConnection() {
        String url = "jdbc:mysql://121.199.55.96:3306/canyin04";
        String user = "canyin04";
        String password = "123456";

        try {
            connection = DriverManager.getConnection(url, user, password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }

    /**
     * 如果执行成功，则返回影响数据的条数，否则返回0
     * 返回-1表示代码有问题
     * 数据库表操作：新增，修改，删除
     * 都叫做更新操作，都用executeUpdate
     *
     * @param sql
     * @return
     */
    public static int update(String sql) {
        try {
//            编译sql语句
            preparedStatement = getConnection().prepareStatement(sql);
//            执行sql语句,并返回影响的条数
            return preparedStatement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close();
        }
        return -1;
    }

    /**
     * 查询的时候，返回的是结果集
     *
     * @param sql
     * @return
     */
    public static ResultSet query(String sql) {
        try {
            //        编译sql语句
            preparedStatement = getConnection().prepareStatement(sql);
            return preparedStatement.executeQuery();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static ResultSet query(String sql, List<Object> list) {
        try {
            //        编译sql语句
            preparedStatement = getConnection().prepareStatement(sql);
//            将list里面的值，赋值给sql语句的问号
            for (int i = 0; i < list.size(); i++) {
                preparedStatement.setObject(i + 1, list.get(i));
            }
            return preparedStatement.executeQuery();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static int getCount(String sql) {

        ResultSet resultSet = JDBC.query(sql);
        try {
//            resultSet.next()判断resultSet是否由下一条数据
            while (resultSet.next()) {
                return resultSet.getInt("count");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return 0;
    }

    public static void main(String[] args) {
        System.out.println(new JDBC().getConnection());
    }

    public static void close() {
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (preparedStatement != null) {
            try {
                preparedStatement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
